/*
    Rust 中，async 函数或块会被视作一个 Future 对象，类似于 JS 里的 Promise，
    async 关键字只是用来定义这个 Future 对象，
    定义好的这片异步代码并不会自动执行，而是需要和 async 配对的 .await 去驱动它才会执行。
*/

// 用 async 定义异步代码，用 .await 驱动执行。
// 但是 .await 又只能在 async 块中调用。

/*
block_on() 可不是一个普通的函数，它必须是一个运行时（Runtime）的入口;
fn main() {
    let a = async {};
    block_on(a);  // 辅助驱动函数 block_on
}

通过几年的时间，tokio 在第三方异步 Runtime 的激烈竞争中胜出，
可以说它现在已经成为了 Rust 生态中异步运行时事实上的标准。
 */

/*
1. 执行异步代码。
2. 遇到 .await 的时候，判断能不能获取到结果。
   如果不能，CPU 不会一直阻塞等，而是缓存当前任务的状态，然后将当前任务挂起，
   放到内部一个任务池中，同时向 OS 注册要监听等待的外部事件。
3. 询问或执行其他任务。 如果所有任务都暂时没有进展，就会进入一个空闲（idle）状态，不会使 CPU 忙等待。
4. 只要某个任务对应所监听到的信号来了，也就是说有结果返回了，
   就会把对应的任务重新捡起来，并从缓存中恢复暂停前的状态，继续往下执行。
   从代码上看，就是从上一个 .await 后面的代码继续往下执行。
5. 遇到下一个 .await，就重复第 1 步～第 4 步。
6. 直到这个异步代码（函数）执行完毕，完成操作或返回结果。
 */
